POJ 1001

poj 1001题

OUTPUT:

输入值为 R n
输出值为 R^n的具体数值


这个题在网上看见了一个很神奇的java代码,很清新,而且抱着试一试的心态通过了poj的text

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.math.*;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
while(in.hasNext()){
BigDecimal val=in.nextBigDecimal();
int n=in.nextInt();
BigDecimal ret=val.pow(n).stripTrailingZeros();
System.out.println( ret.toPlainString().replaceAll("^0", "") );
}
}
}

其中toPlanString(),返回不带指数字段的字符串,replaceAll(“^0”,””),。这篇文章的作者有很强编程能力,现在用C语言去完成这个高精度计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  #include<iostream>
#include<stdlib.h>
#include<cstring>
#define BUFSIZ 200
using namespace std;
char * bigmul(char *m,int lena,char *f,int lenb){ //乘法运算函数。
int i,j,k,lensum,tmp_result,carry,num='0';
lensum=lena+lenb; //确定结果数组的长度。
for(i=0;i<lena;i++){ //将ASCII码转为对应的数字存储。
m[i]=m[i]-num;
}
for(i=0;i<lenb;i++){
f[i]=f[i]-num;
}
char *result,final[BUFSIZ];
result=(char*)calloc(lensum,1);
for(i=0;i<lenb;i++){
//为被乘数作一趟乘法。
for(j=0;j<lena;j++){
tmp_result=f[lenb-i-1]*m[lena-j-1];
result[j+i]+=tmp_result;
}
for(k=0;k<=j+i-1;k++){
//每作一趟乘法整理一次结果数组。
if(result[k]>9){
carry=result[k]/10;
result[k]=result[k]%10;
result[k+1] += carry;
}
}
}
j=0;
if(result[lensum-1]!=0){ //去除前导零将结果整理到final数组中。
final[j]=result[lensum-1]+num;
j++;
}
for(i=lensum-2;i>=0;i--){
final[j++]=result[i]+num;
}
result=final; //将指针指向final数组并返回该指针。
return result;
}
int main(){ //利用main测试方法,用puts打印结果。
int lena,lenb;
char *result,r[BUFSIZ];
int n;
while(cin>>r>>n){
lena=strlen(r);
lenb=strlen(r);
result=r;
for(int i=0;i<n;i++){
result=bigmul(result,lenb,r,lena);
}
puts(result);
}
}

关于大数运算,某朋友给我提供了一个代码,不过在我阅读代码后没有发现有小数位的计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string strMultiply(string str1 , string str2)  
{
string strResult = "";
int len1 = str1.length();
int len2 = str2.length();
int num[500] = {0};
int i = 0, j = 0;
for(i = 0; i < len1; i++)
{
for(j = 0; j < len2; j++)
{
num[len1-1 - i + len2-1 - j] += (str1[i] - '0')*(str2[j] - '0');
}
}
for(i = 0; i < len1 + len2; i++)
{
num[i+1] += num[i] / 10;
num[i] = num[i] % 10;
}
for(i = len1 + len2 - 1; i >= 0 ; i--)
{
if(0 != num[i]) break;
}
for(j = i; j >= 0; j--)
{
strResult += num[j] + '0';
}
return strResult;
}